package com.hmall.item.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hmall.common.constants.MqConstants;
import com.hmall.common.response.PageResultVO;
import com.hmall.common.pojo.Item;
import com.hmall.item.mapper.ItemMapper;
import com.hmall.item.service.IItemService;
import com.hmall.item.web.request.ItemUpdateDTO;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Date;


@Service
public class ItemService extends ServiceImpl<ItemMapper, Item> implements IItemService {

    @Resource
    private RabbitTemplate rabbitTemplate;
    @Resource
    private ItemMapper itemMapper;

    /**
     * 根据itemId和数量num扣减
     *
     * @param id
     * @param num
     */
    @Override
    public void reduceStock(Long id, Integer num) {
        Item item = itemMapper.selectById(id);
//        商品不存在
        if (item == null) {
            return;
        }
//        下架或删除状态
        if (item.getStatus() != 1) {
            throw new RuntimeException("商品不在可售状态");
        }
//        库存不足
        if (!(item.getStock() >= num)) {
            throw new RuntimeException("库存不足");
        }

//        销量增加
        item.setSold(item.getSold() + num);
//        库存减少
        item.setStock(item.getStock() - num);

//        更新数据
        itemMapper.updateById(item);
    }

    /**
     * 库存/销量回档
     *
     * @param id
     * @param num
     * @return
     */
    @Override
    public int returnStock(Long id, Integer num) {
        Item item = itemMapper.selectById(id);
        item.setStock(item.getStock() + num);
        item.setSold(item.getSold() - num);
        return itemMapper.updateById(item);
    }

    // public Page<Item> pageQuery(PageDTO pageDTO){
    //     Integer current=0;
    //     Integer size=0;
    // //目标：查询当前页，每页显示__条数据
    //     Page<Item> page = new Page<>(current,size);
    //    return  itemMapper.selectPage(page, null);
    //
    //     // //1. 设置当前页与页面大小
    //     // Page<com.hmall.common.pojo.Item> page = new Page<>(currentPage, size);
    //     //
    //     // //2.分页查询
    //     // Page<com.hmall.common.pojo.Item> page1 = itemService.page(page);
    //     // //3.封装查询结果
    //     // return new PageResultVO(page1.getTotal(), page1.getRecords());
    //
    // }


    @Override
    public Item findById(Long id) {
        //1.根据商品id查询商品Item数据
        LambdaQueryWrapper<Item> wrapper = new LambdaQueryWrapper<>();

        wrapper.eq(Item::getId, id)
                .select(Item::getId, Item::getName, Item::getPrice,
                        Item::getStock, Item::getImage, Item::getCategory,
                        Item::getBrand, Item::getSpec, Item::getSold,
                        Item::getCommentCount, Item::getStatus, Item::getIsAD);

        return itemMapper.selectById(id);
    }

    @Override
    public void save(ItemUpdateDTO itemUpdateDTO) {
        //新增商品
        Item item = new Item();

        BeanUtils.copyProperties(itemUpdateDTO, item);
        //记录创建时间
        item.setCreateTime(new Date());

        itemMapper.insert(item);

    }

    @Override
    public void update(ItemUpdateDTO itemUpdateDTO) {
        //修改商品
        Item item = new Item();
        BeanUtils.copyProperties(itemUpdateDTO, item);

        //记录修改时间
        item.setUpdateTime(new Date());


        itemMapper.updateById(item);

    }

    @Override
    public void deleteWithId(Long id) {
        //如商品未下架不能删除

        Item item = itemMapper.selectById(id);
        if (item.getStatus() == 1)
            throw new RuntimeException();


        itemMapper.deleteById(id);
    }

    @Override
    public void UpOrOut(Long id, Integer status) {
        //修改上架下架状态
        Item item = Item.builder().
                id(id).
                status(status).
                updateTime(new Date()).
                build();

        itemMapper.updateById(item);

        // 4, 发送 MQ消息
        if (status == 1) {
            rabbitTemplate.convertAndSend(MqConstants.HMALL_EXCHANGE, MqConstants.HMALL_UP_KEY, id);
        } else if (status == 2) {
            rabbitTemplate.convertAndSend(MqConstants.HMALL_EXCHANGE, MqConstants.HMALL_DOWN_KEY, id);

        }
    }


}
